/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.barbon.sudoku.model.entidade;

import br.barbon.sudoku.model.servico.TabuleiroService;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author Barbon
 */
@XmlRootElement
public class Tabuleiro implements Serializable{
    
    private String identificacao;
    //@XmlElementWrapper
    private HashMap<String, Posicao> posicao;
    private Ranking ranking;
    
    public Tabuleiro() {
        List<Coluna> col = new ArrayList<>();
        List<Linha> lin = new ArrayList<>();
        List<Quadrado> qua = new ArrayList<>();
        byte p = 1;

        for (int l = 1; l < 10; l++) {
            lin.add(new Linha((byte) l, new ArrayList<Posicao>()));
        }

        for (int c = 1; c < 10; c++) {
            col.add(new Coluna((byte) c, new ArrayList<Posicao>()));
        }

        for (int q = 1; q < 10; q++) {
            qua.add(new Quadrado((byte) q, new ArrayList<Posicao>()));
        }
        
        posicao = new HashMap<>();
        
        for (Linha l : lin) {
            for (Coluna c : col) {
                Posicao po = new Posicao(p++, (byte) 0, false, l, c, null);
                String chave = TabuleiroService.getChave(po.getLinha().getIdentificacao(), po.getColuna().getIdentificacao());

                posicao.put(chave, po);
                
                c.getPosicao().add(po);
                l.getPosicao().add(po);
                        
                po.setQuadrado(qua.get(TabuleiroService.identificaQuadrado(po.getLinha().getIdentificacao(),
                        po.getColuna().getIdentificacao()) - 1));
                
                qua.get(TabuleiroService.identificaQuadrado(po.getLinha().getIdentificacao(),
                        po.getColuna().getIdentificacao()) - 1).getPosicao().add(po);
            }
        }
    }

    public Tabuleiro(String identificacao, HashMap<String, Posicao> posicao) {
        this.identificacao = identificacao;
        this.posicao = posicao;
    }

    public Tabuleiro(String identificacao, HashMap<String, Posicao> posicao, Ranking ranking) {
        this.identificacao = identificacao;
        this.posicao = posicao;
        this.ranking = ranking;
    }

    public Ranking getRanking() {
        return ranking;
    }

    public void setRanking(Ranking ranking) {
        this.ranking = ranking;
    }

    public String getIdentificacao() {
        return identificacao;
    }

    public void setIdentificacao(String identificacao) {
        this.identificacao = identificacao;
    }

    public HashMap<String, Posicao> getPosicao() {
        return posicao;
    }

    public void setPosicao(HashMap<String, Posicao> posicao) {
        this.posicao = posicao;
    }    
    
}
